]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Constrain tooltips to monitors
authorOwen W. Taylor <otaylor@fishsoup.net>
Tue, 22 Mar 2011 15:56:24 +0000 (11:56 -0400)
committerOwen W. Taylor <otaylor@fishsoup.net>
Tue, 22 Mar 2011 16:38:26 +0000 (12:38 -0400)
Use st_tooltip_set_constrain_func() to set a function that constrains
tooltips to be on the same monitor as the original tip area.

https://bugzilla.gnome.org/show_bug.cgi?id=645547

src/main.c

index 029acb80fe0950961700c835fbee8e4b8b7b5347..393e1b08915abc62f138541465b376c847040e97 100644 (file)
@@ -108,6 +108,45 @@ shell_dbus_init (void)
   g_object_unref (bus);
 }
 
+static void
+constrain_tooltip (StTooltip             *tooltip,
+                   const ClutterGeometry *geometry,
+                   ClutterGeometry       *adjusted_geometry,
+                   gpointer               data)
+{
+  const ClutterGeometry *tip_area = st_tooltip_get_tip_area (tooltip);
+  ShellGlobal *global = shell_global_get ();
+  MetaScreen *screen = shell_global_get_screen (global);
+  int n_monitors = meta_screen_get_n_monitors (screen);
+  int i;
+
+  *adjusted_geometry = *geometry;
+
+  /* A point that determines what screen we'll constrain to */
+  int x = tip_area->x + tip_area->width / 2;
+  int y = tip_area->y + tip_area->height / 2;
+
+  for (i = 0; i < n_monitors; i++)
+    {
+      MetaRectangle rect;
+      meta_screen_get_monitor_geometry (screen, i, &rect);
+      if (x >= rect.x && x < rect.x + rect.width &&
+          y >= rect.y && y < rect.y + rect.height)
+        {
+          if (adjusted_geometry->x + adjusted_geometry->width > rect.x + rect.width)
+            adjusted_geometry->x = rect.x + rect.width - adjusted_geometry->width;
+          if (adjusted_geometry->x < rect.x)
+            adjusted_geometry->x = rect.x;
+
+          if (adjusted_geometry->y + adjusted_geometry->height > rect.y + rect.height)
+            adjusted_geometry->y = rect.y + rect.height - adjusted_geometry->height;
+          if (adjusted_geometry->y < rect.y)
+            adjusted_geometry->y = rect.y;
+
+          return;
+        }
+    }
+}
 
 static void
 update_font_options (GtkSettings *settings)
@@ -139,6 +178,8 @@ update_font_options (GtkSettings *settings)
   else
     st_theme_context_set_default_resolution (context);
 
+  st_tooltip_set_constrain_func (stage, constrain_tooltip, NULL, NULL);
+
   /* Clutter (as of 0.9) passes comprehensively wrong font options
    * override whatever set_font_flags() did above.
    *